package com.sinochem.yunlian.ship.common.tuple;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Objects;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public final class BodyPair<L, R, M> implements Serializable{

    /**
	 * 
	 */
	private static final long serialVersionUID = -5304330644589991960L;
	
	private static final Logger logger = LoggerFactory.getLogger(BodyPair.class);
	
	/** Max 3 parameter */
    public HashMap<Object, Object> body = new HashMap<>(3);

    public BodyPair() {
		
	}
    /**
     * @param left 第一参数对象
     */
    public BodyPair(final L left) {
    	
    	if (Objects.nonNull(left)) {
    		body.put(left.getClass().getSimpleName(), left);
    	}
    }
    /**
     * @param left 第一参数对象
     * @param middle 第二参数对象
     */
    public BodyPair(final L left, final R middle) {
    	
    	if (Objects.nonNull(left)) {
    		body.put(left.getClass().getSimpleName(), left);
    	}
    	if (Objects.nonNull(middle)) {
    		body.put(middle.getClass().getSimpleName(), middle);
    	}
    }
    /**
     * 
     * @param left 第一参数对象
     * @param middle 第二参数对象
     * @param right 第三参数对象
     */
    public BodyPair(final L left, final R middle, final M right) {
    	
    	if (Objects.nonNull(left)) {
    		body.put(left.getClass().getSimpleName(), left);
    	}
    	if (Objects.nonNull(middle)) {
    		body.put(middle.getClass().getSimpleName(), middle);
    	}
    	if (Objects.nonNull(right)) {
    		body.put(right.getClass().getSimpleName(), right);
    	}
    }
    /**
     * 
     * @param left
     * @param middle
     * @param right
     * @param laster 超过三组参数对象，剩余的参数对象则放到该参数
     */
    public BodyPair(final L left, final R middle, final M right, final Object ...laster) {
    	
    	if (Objects.nonNull(laster) && laster.length > 0) {
    		
    		body = null;
    		body = new HashMap<>(laster.length + 3);
    		Object[] objects = laster;
    		
    		for (Object object : objects) {
    			logger.info("输出对象过多的部分laster:{}", object);
    			body.put(object.getClass().getSimpleName(), object);
    		}
    	}
    	if (Objects.nonNull(left)) {
    		body.put(left.getClass().getSimpleName(), left);
    	}
    	if (Objects.nonNull(middle)) {
    		body.put(middle.getClass().getSimpleName(), middle);
    	}
    	if (Objects.nonNull(right)) {
    		body.put(right.getClass().getSimpleName(), right);
    	}
    	
    }

    public Object getBody(Object key) {
    	
        return body.get(key);
    }


}
